package kr.co.mcshop.cart;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.aop.aspectj.AspectJAdviceParameterNameDiscoverer.AmbiguousBindingException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RequestMapping(value = "/cart")
@Controller
public class cartController {
	
	//public ArrayList<Map> itemList = new ArrayList<Map>();
	@RequestMapping(value="/CartList")
	public String cartList(Model model, HttpSession session){
		int AmountTotal = TotalAmount(session);
		// 현재 cartList에 동일 아이템 존재여부를 체크하기 위한 cartListChechk()메소드 호출

		model.addAttribute("AmountTotal", AmountTotal);
		return "CartList";
	}
	
	@RequestMapping(value = "/cartAdd")
	public String CartAdd(@RequestParam Map map, Model model,HttpSession session) {
		// 카트에 등록되는 정보를 저장할 ArrayList형 itemList
		System.out.println("cartAdd : " + map);
		put(map, session);
		//System.out.println("arrayList에 있는 itemList" + itemList);
		int AmountTotal = TotalAmount(session);
		// 현재 cartList에 동일 아이템 존재여부를 체크하기 위한 cartListChechk()메소드 호출

		model.addAttribute("AmountTotal", AmountTotal);
		return "CartList";
	}

	public int put(Map pushedItem, HttpSession session) {
		int AmountTotal = 0;
		// 카트에 있는 상품들의 총 합계를 위한 변수 초기화;
		boolean itemExistInCart = false;
		
		ArrayList<Map> itemList =  new ArrayList<Map>(); 
		//세션에 값을 List로 연산하기 위한 itemList
		if(session.getAttribute("itemList")==null){
			itemList.add(pushedItem);
			System.out.println("if절" + itemList);
			session.setAttribute("itemList", itemList);
			
		}else{
			itemList.addAll((ArrayList<Map>) session.getAttribute("itemList"));
			System.out.println("put Method()" + itemList );
						
			String pushedItemId = (String) pushedItem.get("no");
			String pushedItemOpt1 = (String) pushedItem.get("opts1");
			String pushedItemOpt2 = (String) pushedItem.get("opts2");
			// 카트의 상품 수만큼 반복실행'
			for (Map cartItem : itemList) {
				// 카트에 있는 상품의 ID를 취득
				String cartItemId = (String) cartItem.get("no");
				String cartItemOpt1 = (String) cartItem.get("opts1");
				String cartItemOpt2 = (String) cartItem.get("opts2");
				// 카트에 담겨진 각 아이템들의 가격과 수량을 곱하여, 총 가격을 구하는 부분,
				if (cartItemId.equals(pushedItemId)
						&& cartItemOpt1.equals(pushedItemOpt1)
						&& cartItemOpt2.equals(pushedItemOpt2)) {
					// 동일ID의 상품이 카트에 존재하는 경우, 수량만 가산
					int cartItemQuantity = (Integer.parseInt(cartItem.get(
							"quantity").toString()));
					// 현재 카트에 들어있는 아이템의 수량체크,
					int pushedItemQuantity = (Integer.parseInt(pushedItem.get(
							"quantity").toString()));
					// 새롭게 선택된 아이템의 수량체크
					int quantity = cartItemQuantity + pushedItemQuantity;
					
					// 현재 카트에 존재하는 아이템의 수량과, 새롭게 추가된 아이템의 수량을 더함
					cartItem.put("quantity", quantity);
					itemExistInCart = true;
				}
					
			}
			if(itemExistInCart){
				session.setAttribute("itemList", itemList);
				System.out.println("itemExistInCart 트루" + session.getAttribute("itemList"));
			}else{
			itemList.add(pushedItem);
			session.setAttribute("itemList", itemList);
			System.out.println("itemExistInCart false" + session.getAttribute("itemList"));
			}
		}
		return AmountTotal;
	}

	public int TotalAmount(HttpSession session) {
		ArrayList<Map> itemList =  new ArrayList<Map>();
		itemList.addAll((ArrayList<Map>) session.getAttribute("itemList"));
		int AmountTotal = 0;
		for (Map map : itemList) {
			int price = (Integer.parseInt(map.get("price").toString()));
			int itemQuantity = (Integer
					.parseInt(map.get("quantity").toString()));
			AmountTotal += (price * itemQuantity);
		}
		System.out.println("totalAmount" + itemList);
		System.out.println("totalAmount" + AmountTotal);
		return AmountTotal;
	}

	@RequestMapping(value = "/cartClear")
	public String CartClear(HttpSession session) {
		session.removeAttribute("itemList");
		return "CartList";
	}
	
	@RequestMapping(value="/cartAfterResult")
	public String cartAfterResult(HttpSession session){
		session.removeAttribute("itemList");
		return "redirect:/";
	}
	
	@RequestMapping(value = "/cartEdit")
	public String CartEdit(@RequestParam Map map, Model model,
			HttpSession session) {
		ArrayList<Map> list = (ArrayList<Map>) session.getAttribute("itemList");
		// 현제 session("itemList")에 저장된 데이터를 가져옴,
		int index = Integer.parseInt(map.get("pos").toString());
		// session에 저장된 ArrayList<Map>중에서 선택된 아이템목록의 값을 수정하기 위하여,
		// 선택된 아이템인덱스의 값을 index에 저장함
		int quantity = (Integer.parseInt(map.get("num").toString()));
		// session에 저장된 ArrayList<Map>중에서 지정된 quantity의 값을 수정하기 위하여
		// CartList.jsp에서 넘어온 아이템목록의 수정값을 quantity에 저장함
		list.get(index).put("quantity", quantity);
		// 현재 세션에 저장된 ArrayList<Map>중에서 지정된 위치(index)와 넘어온 수정값(quantity)를
		// 지정된 index에 저장함
		session.setAttribute("itemList", list);
		// 세션에 변경된 list를 저장함
		int totalAmount = TotalAmount(session); 
		model.addAttribute("AmountTotal", totalAmount);
		return "CartList";
	}

	@RequestMapping(value = "/cartDelete")
	public String CartDelete(@RequestParam Map map, HttpSession session, Model model) {
		ArrayList<Map> list = (ArrayList<Map>) session.getAttribute("itemList");
		// 현제 session("itemList")에 저장된 데이터를 가져옴,
		int index = Integer.parseInt(map.get("pos").toString());
		// session에 저장된 ArrayList<Map>중에서 선택된 아이템목록의 값을 수정하기 위하여,
		// 선택된 아이템인덱스의 값을 index에 저장함
		list.remove(index);
		// 지정된 인덱스의 리스트를 삭제함
		session.setAttribute("itemList", list);
		// session에 수정된 list를 저장함.
		int totalAmount = TotalAmount(session); 
		model.addAttribute("AmountTotal", totalAmount);
		return "CartList";
	}
}
